package com.ft.util;

import java.lang.reflect.InvocationTargetException;

/**
 * @author huangxiao
 * @date 2018/7/10 13:53
 */
public class EnumUtils {

    /**
     * 获取枚举中的值, 先匹配 name, 再匹配 getId(数字), 再匹配 getDesc(中文), 都匹配不上则返回 null
     *
     * @param clazz 枚举的类信息
     * @param obj 要匹配的值
     */
    public static <E extends Enum> E toEnum(Class<E> clazz, Object obj) {
        if (obj != null) {
            E[] constants = clazz.getEnumConstants();
            if (constants != null) {
                String source = obj.toString().trim();
                for (E em : constants) {
                    // 如果传递过来的是枚举名, 且能匹配上则返回
                    if (source.equalsIgnoreCase(em.name())) {
                        return em;
                    }

                    // 如果传递过来的值跟枚举的 getCode(数字) 相同则返回
                    Object id = getMethod(em, "getId");
                    if (id != null && source.equalsIgnoreCase(id.toString().trim())) {
                        return em;
                    }

                    // 如果传递过来的值跟枚举的 getValue(中文) 相同则返回
                    id = getMethod(em, "getDesc");
                    if (id != null && source.equalsIgnoreCase(id.toString().trim())) {
                        return em;
                    }

                    // 如果传递过来的值跟枚举的 ordinal(数字. 表示枚举所在的索引) 相同则返回
                    // if (source.equalsIgnoreCase(String.valueOf(em.ordinal()))) return em;
                }
            }
        }
        return null;
    }

    /** 调用对象的公有方法. 将会忽略异常只返回 null, 如果要对异常专门记录勿调用此方法 */
    public static Object getMethod(Object obj, String method, Object... param) {
        if (method != null) {
            try {
                return obj.getClass().getDeclaredMethod(method).invoke(obj, param);
            } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                // ignore
            }
            // getMethod 会将从父类继承过来的 public 方法也查询出来
            try {
                return obj.getClass().getMethod(method).invoke(obj, param);
            } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) {
                // ignore
            }
        }
        return null;
    }


}
